无名名字空间
有时,将一组声明包裹在一个名字空间里就是为了避免可能的名字冲突,这一做法经常也是很有价值的。这样做的目的只是保持代码的局部性,而不是为用户提供界面。例如,
#include "header.h"
namespace Mine {
int a;
void f() { /* ... */ }
int g() { /* ... */ }
}
因为我们并不希望名字Mine被局部的环境之外知道,去发明这个多余的名字也就成了一种烦恼,还可能偶然地与其他什么名字相冲突。在这种情况下,我们可以简单地让这个名字空间没有名字:
#include "header.h"
namespace {
int a;
void f() { /* ... */ }
int g() { /* ... */ }
}
很显然,必须存在某种方式,使我们可以从一个无名的名字空间之外访问其中的成员。因此,无名名字空间有一个隐含的使用指令。上面声明等价于
namespace $$$ {
int a;
void f() { /* ... */ }
int g() { /* ... */ }
}
using namespace $$$;
其中$$$是在这个名字空间定义所在的作用域里具有惟一性的名字。特别地,在不同编译单位里的无名名字空间也互不相同。正如我们所希望的,在其他编译单位里将无法说出这个无名名字空间中的成员名字。
🔚